<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Reserva extends CI_Controller {

    public function __construct() {
        parent::__construct();
        session_start();
        $this->estaLogueado();
        $this->load->model('cuartoM');
        $this->load->model('clienteM');
        $this->load->model('reservaM');
        $this->load->model('reserva_x_cuartoM');
        $this->load->model('procedencia_destinoM');
        $this->load->model('cliente_x_reservaM');
        $this->load->model('tarifa_x_diaM');
        $this->load->model('periodoM');
        $this->load->model('categoriaM');
        $this->load->model('categoria_x_temporadaM');
        $this->load->model('tarifa_x_personam');
        $this->load->model('reserva_x_cuartoM');
        $this->load->model('establecimientoM');
        $this->load->model('impuestoM');
        $this->load->model('ajusteM');
    }

    public function crearReserva() {
        //var_dump($_POST);
        $this->escapar($_POST);
        $this->validarFechaLegadaSalida($_POST['desde'], $_POST['hasta'], $_POST['idHabitacion'], "nuevaReserva");
        $idCliente;
        if (empty($_POST["nombre"])) {
            $_SESSION["mensaje"]["contenido"] = "El nombre del huésped es obligatorio";
            $_SESSION["mensaje"]["tipo"] = "advertencia";
            header("location:../calendario");
            exit();
        }
        if ($_POST['quien'] == 'persona') {
            if ($_POST['fechaNacimiento'] != "") {
                $this->formatoFechaBD($_POST['fechaNacimiento']);
            }
            if ($_POST['idCliente'] == '') {
                $this->clienteM->crearClientePersona($_POST['documento'], $_POST['nacionalidad'], $_POST['tipoDocumento'], $_POST['nombre'], $_POST['primerApellido'], $_POST['segundoApellido'], '', $_POST['fechaNacimiento'], $_POST['telefono'], $_POST['email'], $_POST['ocupacion'], $_POST['direccion']);
                $idCliente = mysql_insert_id();
            } else {
                $idCliente = $_POST['idCliente'];
                $this->clienteM->actualizarClientePersona($_POST['idCliente'], $_POST['documento'], $_POST['nacionalidad'], $_POST['tipoDocumento'], $_POST['nombre'], $_POST['primerApellido'], $_POST['segundoApellido'], '', $_POST['fechaNacimiento'], $_POST['telefono'], $_POST['email'], $_POST['ocupacion'], $_POST['direccion']);
            }
        } else if ($_POST['quien'] == 'empresa') {
            if ($_POST['idCliente'] == '') {
                $this->clienteM->crearClienteEmpresa($_POST['identificacionEmpresa'], $_POST['paisEmpresa'], $_POST['nombreEmpresa'], $_POST['telefonoEmpresa'], $_POST['direccionEmpresa'], $_POST['emailEmpresa']);
                $idCliente = mysql_insert_id();
            } else {
                $idCliente = $_POST['idCliente'];
                $this->clienteM->actualizarClienteEmpresa($_POST['idCliente'], $_POST['identificacionEmpresa'], $_POST['paisEmpresa'], $_POST['nombreEmpresa'], $_POST['telefonoEmpresa'], $_POST['direccionEmpresa'], $_POST['emailEmpresa']);
            }
        }
        $desde = explode('/', $_POST['desde']);
        $hasta = explode('/', $_POST['hasta']);
        $desde = $desde[2] . '-' . $desde[1] . '-' . $desde[0];
        $hasta = $hasta[2] . '-' . $hasta[1] . '-' . $hasta[0];
        $seguroHotelero = $this->establecimientoM->obtenerDatos("tiene_seguro_hotelero, seguro_hotelero", $_SESSION["establecimiento"]["id_establecimiento"]);
        $valorSeguroHotelero = 0;
        if ($seguroHotelero[0]->tiene_seguro_hotelero == 1) {
            $valorSeguroHotelero = $seguroHotelero[0]->seguro_hotelero;
        }
        $this->reservaM->crearNuevaReserva($idCliente, $desde, $hasta, $_POST["selectCantidadPersonas"], $valorSeguroHotelero, $_POST["idAgencia"], $_POST["selectConfProv"]);
        $idReserva = mysql_insert_id();
        $this->reserva_x_cuartoM->registrarReserva($idReserva, $_POST['idHabitacion']);
        if ($_POST['quien'] == 'persona') {
            $this->cliente_x_reservaM->registrarClinteEnReserva($idReserva, $idCliente);
            if (isset($_POST["proDes"])) {
                $this->procedencia_destinoM->insertarRegistro($idReserva, $idCliente, $_POST['paisProcedencia'], $_POST['paisDestino'], $_POST['ciudadProcedencia'], $_POST['ciudadDestino']);
            }
        }

        if ($desde == $hasta) {
            $hasta = strtotime('+1 day', strtotime($hasta));
            $hasta = date('Y-m-j', $hasta);
        }
        $this->tarifa_x_dia($desde, $hasta, $idReserva, $_POST["selectCantidadPersonas"], $_POST["idHabitacion"]);

        $_SESSION["mensaje"]["contenido"] = "Reserva creada exitosamente";
        $_SESSION["mensaje"]["tipo"] = "exito";
        header("location:../reserva?id=" . $idReserva);
    }

    public function calcularTarifas() {
        $this->escapar($_POST);
        if (!empty($_POST["idReserva"]) && $this->validarReservaPost($_POST["idReserva"])) {


            $this->verificarCantidadHuespedes($_POST["idReserva"]);
            $idCuarto = $this->reserva_x_cuartoM->obtenerDatos("id_cuarto", $_POST["idReserva"]);
            $idCuarto = $idCuarto[0]->id_cuarto;
            $this->validarFechaLegadaSalida($_POST['desde'], $_POST['hasta'], $idCuarto, "actulaizarReserva");

            $this->formatoFechaBD($_POST["desde"]);
            $this->formatoFechaBD($_POST["hasta"]);
            $this->tarifa_x_diaM->eliminarRegistros($_POST["idReserva"], $idCuarto);
            $this->reservaM->actualizarIngresoSalidaCantidadPersonas($_POST["desde"], $_POST["hasta"], $_POST["selectCantidadPersonas"], $_POST["idReserva"]);
            if ($_POST["desde"] == $_POST["hasta"]) {
                $_POST["hasta"] = strtotime('+1 day', strtotime($_POST["hasta"]));
                $_POST["hasta"] = date('Y-m-j', $_POST["hasta"]);
            }
            $this->tarifa_x_dia($_POST["desde"], $_POST["hasta"], $_POST["idReserva"], $_POST["selectCantidadPersonas"], $idCuarto);

            $this->reservaM->actualizarEstatus($_POST["idReserva"]);
            $_SESSION["mensaje"]["contenido"] = "Los cambios se guardaron exitosamente";
            $_SESSION["mensaje"]["tipo"] = "exito";
           header("location:../reserva?id={$_POST['idReserva']}");
        } else {
            $_SESSION["mensaje"]["contenido"] = " La reserva no existe.";
            $_SESSION["mensaje"]["tipo"] = "advertencia";
            header("Location:calendario");
        }
    }

    private function verificarCantidadHuespedes($idReserva) {
        $clientesDecalarados = $_POST["selectCantidadPersonas"];

        $clientesRegistrados = $this->cliente_x_reservaM->contarHuespedes($idReserva);
        $clientesRegistrados = $clientesRegistrados[0]->cantidad;
        if ($clientesRegistrados > $clientesDecalarados) {
            $_SESSION["mensaje"]["contenido"] = "Se han registrado $clientesRegistrados huéspedes en esta reserva";
            $_SESSION["mensaje"]["tipo"] = "advertencia";
            header("location:../reserva?id={$_POST['idReserva']}");
            exit();
        }
    }

    private function validarReservaPost($idReserva) {
        $r = $this->reservaM->esMiReserva($idReserva, $_SESSION['establecimiento']['id_establecimiento']);
        if ($r[0]->cantidad == 1) {
            return true;
        } else {
            return false;
        }
    }

    private function tarifa_x_dia($desde, $hasta, $idReserva, $cantidadPersonas, $idHabitacion) {
        $idCategoria = $this->cuartoM->obtenerDatos('id_categoria', $idHabitacion);
        $idCategoria = $idCategoria[0]->id_categoria; //Categoria de la habitación
        $periodos = $this->periodoM->obtenerPeridosPorCategoria($_SESSION["establecimiento"]["id_establecimiento"]); //Obteno los periodos por medios de la categoria
        // var_dump($periodos);
        $impuestosPorAlojamiento = $this->reservaM->obtenerDatos("impuesto", $idReserva);
        $impuestosPorAlojamiento = $impuestosPorAlojamiento[0]->impuesto;

        $diferenciaDias = $this->diferenciaFechas($desde, $hasta);
        $this->reservaM->quitarTotalHospedaje($idReserva);
        $valorTotalHospedaje = 0;
        for ($i = 0; $i < $diferenciaDias; $i++) {
            $hoy = date("Y-m-d", strtotime("$desde +$i day"));

            $hoyAux = explode("-", $hoy);
            $mesHoyHospedaje = $hoyAux[1];
            $diaHoyHospedaje = $hoyAux[2];
            $precio = 0;
            foreach ($periodos as $row) {
                $fechaInicio = explode("-", $row->fecha_inicio);
                $fechaFin = explode("-", $row->fecha_fin);

                $mesInicioPeriodo = $fechaInicio[0];
                $diaInicioPeriodo = $fechaInicio[1];

                $mesFinPeriodo = $fechaFin[0];
                $diaFinPeriodo = $fechaFin[1];
                //  echo "$mesHoyHospedaje >= $mesInicioPeriodo && $diaHoyHospedaje >= $diaInicioPeriodo && $mesHoyHospedaje <= $mesFinPeriodo && $diaHoyHospedaje <= $diaFinPeriodo <br><br>";

                if ($mesHoyHospedaje == $mesInicioPeriodo && $diaHoyHospedaje >= $diaInicioPeriodo && $mesHoyHospedaje == $mesFinPeriodo && $diaHoyHospedaje <= $diaFinPeriodo) {
                    $precio = $this->obtenerPrecio($row->id_temporada, $idCategoria, $cantidadPersonas, $hoy);
                } else if ($mesHoyHospedaje > $mesInicioPeriodo && $mesHoyHospedaje < $mesFinPeriodo) {
                    $precio = $this->obtenerPrecio($row->id_temporada, $idCategoria, $cantidadPersonas, $hoy);
                } else if ($mesHoyHospedaje == $mesInicioPeriodo && $diaHoyHospedaje >= $diaInicioPeriodo && $mesHoyHospedaje < $mesFinPeriodo) {
                    $precio = $this->obtenerPrecio($row->id_temporada, $idCategoria, $cantidadPersonas, $hoy);
                } else if ($mesHoyHospedaje == $mesFinPeriodo && $diaHoyHospedaje <= $diaFinPeriodo && $mesHoyHospedaje > $mesInicioPeriodo) {
                    $precio = $this->obtenerPrecio($row->id_temporada, $idCategoria, $cantidadPersonas, $hoy);
                }

//                if ($mesHoyHospedaje == $mesInicioPeriodo && $diaHoyHospedaje >= $diaInicioPeriodo && $mesHoyHospedaje == $mesFinPeriodo && $diaHoyHospedaje <= $diaFinPeriodo) {
//                    $precio = $this->obtenerPrecio($row->id_temporada, $idCategoria, $cantidadPersonas, $hoy);
//                }
            }
            $valorTotalHospedaje = $valorTotalHospedaje + $precio;
            $this->tarifa_x_diaM->insertarRegistro($idReserva, $idHabitacion, $hoy, $precio);
        }
        $totalAjusteAlojamiento = $this->ajusteM->totalAjusteAlojamiento($idReserva);
        $totalAjusteAlojamiento = $totalAjusteAlojamiento[0]->totalAjuste;
        $valorTotalHospedaje = $valorTotalHospedaje + $totalAjusteAlojamiento;
        $this->reservaM->actualizarTotalHospedaje($valorTotalHospedaje, $idReserva);
        if ($impuestosPorAlojamiento != 0) {
            $impuesto = $this->impuestoM->obtenerImpuestos($_SESSION["establecimiento"]["id_establecimiento"]);
            $valorImpuesto = $valorTotalHospedaje * $impuesto[0]->valor / 100;
            $valorTotalHospedaje = $valorTotalHospedaje + $valorImpuesto;
            $this->reservaM->actulizarImpuesto($valorImpuesto, $idReserva);
        }
        $this->reservaM->actualizarTotalPagar($valorTotalHospedaje, $idReserva);
    }

    private function obtenerPrecio($idTemporada, $idCategoria, $cantidadPersonas, $hoy) {
        $capacidadEstandar = $this->categoriaM->obtenerDatos("capacidad_estandar", "where id_categoria='$idCategoria'");
        $capacidadEstandar = $capacidadEstandar[0]->capacidad_estandar;
        $valor = 0;
        $tarifas = $this->categoria_x_temporadaM->obtenerDatos("tarifa_persona_adicional,incremento_viernes,incremento_sabado,incremento_domingo ", "where id_temporada='$idTemporada' AND id_categoria='$idCategoria'");
        if ($capacidadEstandar < $cantidadPersonas) {//Hay sobrecupo
            $tarifaPersonaAdicional = $tarifas[0]->tarifa_persona_adicional;
            $sobreCupo = $cantidadPersonas - $capacidadEstandar;
            $valor = $valor + $sobreCupo * $tarifaPersonaAdicional;
            $cantidadPersonas = $capacidadEstandar;
        }


        $dia = date("w", strtotime($hoy));
        if ($dia == 5) {//Si hoy es vienes le cobro más.
            $valor = $valor + $tarifas[0]->incremento_viernes * $cantidadPersonas;
        } else if ($dia == 6) {//Si hoy es sábado le cobro más.
            $valor = $valor + $tarifas[0]->incremento_sabado * $cantidadPersonas;
        } else if ($dia == 0) {//Si hoy es domingo le cobro más.
            $valor = $valor + $tarifas[0]->incremento_domingo * $cantidadPersonas;
        }


        $valorAux = $this->tarifa_x_personam->obtenerDatos("valor", "where id_temporada='$idTemporada' AND id_categoria='$idCategoria' AND n_personas='$cantidadPersonas'");
        $valor = $valor + $valorAux[0]->valor;
        return $valor;
    }

    private function validarFechaLegadaSalida($desde, $hasta, $idHabitacion, $tipo) {
        $desde = explode('/', $desde);
        $hasta = explode('/', $hasta);
        $anioInicio = $desde[2];
        $anioFin = $hasta[2];
        $mesInicio = $desde[1];
        $mesFin = $hasta[1];
        $desde = $desde[2] . '-' . $desde[1] . '-' . $desde[0];
        $hasta = $hasta[2] . '-' . $hasta[1] . '-' . $hasta[0];
        $desde2 = strtotime('+1 day', strtotime($desde));
        $desde2 = date('Y-m-j', $desde2);
        $hasta2 = strtotime('-1 day', strtotime($hasta));
        $hasta2 = date('Y-m-j', $hasta2);
        if ($tipo == "nuevaReserva") {
            $_POST["idReserva"] = "";
        }
        $cantidadReservas = $this->reservaM->verificarFechas($desde, $desde2, $hasta, $hasta2, $idHabitacion, $_POST["idReserva"]);
        if ($tipo == "nuevaReserva") {
            if ($cantidadReservas[0]->cantidad != 0) {
                $_SESSION["mensaje"]["contenido"] = "Fechas inválidas";
                $_SESSION["mensaje"]["tipo"] = "advertencia";
                header("Location:../calendario");
                exit();
            }
        } else if ($tipo == "actulaizarReserva") {
            if ($cantidadReservas[0]->cantidad != 0) {
                $_SESSION["mensaje"]["contenido"] = "Fechas inválidas";
                $_SESSION["mensaje"]["tipo"] = "advertencia";
                header("location:../reserva?id={$_POST['idReserva']}");
                exit();
            }
        }
        $difAnio = $anioFin - $anioInicio;
        $difMes = $mesFin - $mesInicio;
        /* Validar que la duracion de la reserva no sea mayor a 6 meses */
        if ($difAnio == 0 && $difMes > 6) {
            $_SESSION["mensaje"]["contenido"] = "La estadia no debe ser mayor a 6 meses";
            $_SESSION["mensaje"]["tipo"] = "advertencia";
            header("Location:../calendario");
            exit();
        } else if ($difAnio == 1 && (12 - $mesInicio + $mesFin) > 6) {
            $_SESSION["mensaje"]["contenido"] = "La estadia no debe ser mayor a 6 meses";
            $_SESSION["mensaje"]["tipo"] = "advertencia";
            header("Location:../calendario");
            exit();
        } else if ($difAnio > 1) {
            $_SESSION["mensaje"]["contenido"] = "La estadia no debe ser mayor a 6 meses";
            $_SESSION["mensaje"]["tipo"] = "advertencia";
            header("Location:../calendario");
            exit();
        }
    }

    private function diferenciaFechas($desde, $hasta) {
        $datetime1 = date_create($desde);
        $datetime2 = date_create($hasta);
        $intervalo = date_diff($datetime1, $datetime2);
        return $intervalo->days;
    }

}
